package com.cbg.es.repository;

import com.cbg.es.dto.EsTableListDTO;
import com.cbg.es.entity.EsTableCategory;
import com.shuyuwl.core.repository.DaoRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 全景通查分类下展示表 repository
 *
 * @author wangjuzheng
 * @since 2019-10-16
 */
@Repository
public interface IEsTableCategoryRepository extends DaoRepository<EsTableCategory, Long> {

    /**
     * 查询分类下未删除的展示表信息
     *
     * @param categoryId 分类id
     * @param status     状态
     * @return 展示表列表信息
     */
    List<EsTableCategory> findByCategoryIdAndStatusLessThanOrderBySortAsc(Long categoryId, Byte status);

    /**
     * 查询展示表详情
     *
     * @param tableCategoryId 展示表id
     * @param status          状态
     * @return 展示表详情
     */
    EsTableCategory findByIdAndStatusLessThanOrderBySortAsc(Long tableCategoryId, Byte status);

    /**
     * 查询分类下未删除的展示表信息
     *
     * @param categoryId  分类id
     * @param status      状态
     * @param tableStatus 基础表状态
     * @return 展示表信息
     */
    @Query("select new com.cbg.es.dto.EsTableListDTO(c.id,t.id,t.tableName,t.tableNameCn,c.tableName,c.status) " +
            "from  EsTableCategory c left join EsTable t on c.tableId = t.id " +
            "where c.categoryId=?1 and c.status<?2 and t.status=?3 order by c.sort asc ")
    List<EsTableListDTO> selectedCategory(Long categoryId, Byte status, Byte tableStatus);

    /**
     * 查询分类id下的最大排序号
     *
     * @param categoryId 分类id
     * @param status     状态
     * @return 排序号
     */
    @Query("select MAX(sort) from EsTableCategory where categoryId=?1 and status<?2")
    Integer getMaxSort(Long categoryId, Byte status);

    /**
     * 查询全部的展示表信息
     *
     * @param tableCategoryIds 展示表id集合
     * @param status           状态
     * @param tableStatus      表状态
     * @return 展示表信息
     */
    @Query("select c from  EsTableCategory c left join EsTable t on c.tableId = t.id " +
            "where c.categoryId in ?1 and c.status<?2 and t.status=?3 order by c.sort asc ")
    List<EsTableCategory> getAllEsTableCategory(List<Long> tableCategoryIds, Byte status, Byte tableStatus);

    /**
     * 删除分类下的展示表信息
     *
     * @param categoryId 分类id
     * @param ids        展示表id集合
     * @param status     状态
     */
    @Modifying
    @Query("update EsTableCategory  set status =?3 where categoryId=?1 and id not in ?2 and  status <?3")
    void deleteByCategoryIdAndTableCategoryIdNeqIn(Long categoryId, List<Long> ids, Byte status);


    /**
     * 删除分类下的所有的展示表和对应的列信息
     *
     * @param categoryId 分类id
     * @param status     状态
     */
    @Modifying
    @Query(value = "UPDATE es_table_category e LEFT JOIN es_table_col c ON c.es_table_category_id = e.id  " +
            " SET e.status = ?2, c.status = ?2 WHERE e.category_id = ?1 AND e.status< ?2 AND c.status < ?2", nativeQuery = true)
    void deleteByCategoryId(Long categoryId, Byte status);
}
